﻿#ifndef __GAF_WINDOW_H__
#define __GAF_WINDOW_H__

namespace GAF
{
	struct CreateWindow;
	class Window;
}
typedef GAF::CreateWindow		GAF_SCreateWindow;
typedef GAF::Window			GAF_CWindow;

#include "GAF_Define.h"
#include "GAF_Command.h"
#include "GAF_Scene.h"
#include "GAF_Canvas.h"

namespace GAF
{
	/**
 	 *  @addtogroup Frame
	 *  @{
	 */

	/// 创建窗口信息结构
	struct CreateWindow
	{
		Window*			pWindow;	// 已经生成的窗口类

		UINT			nWidth;
		UINT			nHeight;
		bool			isFullScreen;

		bool			isHardware;	// 硬件加速

		_STRING			strTitle;

		Bundle			bdlOther;
	};


	/// 运行窗口类
	class Window
	{
	public:
		/// 重置创建窗口数据结构
		static void		ResetCWStruct(CreateWindow& cw);


	public:
		Window();
		~Window();

	public:
		/// 设置窗口标题
		virtual void		SetTitle(const _STRING strTitle);

		Scene*			GetTopScene();
	public:
		/// 初始化窗口
		bool			InitWindow(CreateWindow& cw);
		/// 显示窗口
		bool			ShowWindow();
		/// 隐藏窗口
		void			HideWindow();
		/// 运行窗口
		bool			RunWindow();
		/// 更新窗口
		void			UpdateWindow();
		/// 渲染窗口
		void			RenderWindow();
		/// 翻转窗口
		void			FlipWindow();
		/// 空闲窗口
		void			IdleWindow();
		/// 关闭窗口
//		void			CloseWindow();

	public:
		/// 运行一次
		bool			OnceWindow();
		/// 显示场景(更换主场景)
		void			ShowScene(Scene* pScene);
		/// 调用场景(弹出场景)
		void			CallScene(Scene* pScene);
		/// 切换场景
		bool			SwitchScene();
	private:

	public:
		/// 设置FPS每秒画面更新次数
		void			SetFPS(UINT nFPS);
		/// 获得FPS每秒画面更新次数
		UINT			GetFPS();

		/// 获得窗口句柄
		WindowHandle		GetHandle();

	protected:
		/// 初始化窗口时
		virtual WindowHandle	OnInitWindow(CreateWindow& cw)
					{return NULL;}
		/// 获得窗口命令时
		/**
		 *  @return 是否已对本命令作出相应处理
		 */
		virtual bool		OnGetCommand(Command& cmdGet)
					{return false;}

	private:
		bool			StartScene(Scene* pScene);
		void			EndScene(Scene* pScene);
		
		// 更新场景
		void			UpdateScene(Scene* pScene);
		// 渲染场景
		void			RenderScene(Scene* pScene);
		// FPS控制
		void			FPSControl();

	private:
		/// 获得窗口命令
		virtual bool		GetCommand(Command& cmdGet);


	public:
		/// 窗口尺寸属性（只读）
		DIM_ATTRIB_R(Size, Size);
		/// 窗口全屏属性（只读）
		DIM_ATTRIB_R(bool, FullScreen);

	protected:
		/// 窗口句柄
		WindowHandle		m_pWndHandle;
		/// 窗口主场景指针
		Scene*			m_pMainScene;
		/// 窗口顶层场景指针
		Scene*			m_pTopScene;

		/// 跳转目标主场景指针
		Scene*			m_pShowScene;
		/// 呼叫的场景指针
		Scene*			m_pCallScene;

		/// 窗口更新时间属性
		UINT			m_nFPS;
		TimeTicks		m_ttFPST;

	private:
		bool			m_isExitWnd;
		bool			m_isShowWnd;

#ifdef GAF_FPS_CONTROL
	private:
		TimeTicks		m_ttSaveFPST;
		TimeTicks		m_ttFPSTUse;
#endif

	};

	/** @} */

}

#endif